/** *****************axios的二次封装，主要是封装请求拦截器和响应拦截器 ************/
/** 实现步骤
 * 1. 创建一个新的axios实例
 * 2. 请求拦截器，如果有token进行头部携带
 * 3. 响应拦截器
 **/

// 导入axios
import axios from 'axios'
// 引入进度条
import nprogress from 'nprogress'
// 引入进度条样式
import 'nprogress/nprogress.css'

/**
 * TODO-1: 利用axios的create方法，创建一个新的axios实例
 */
const instance = axios.create({
  // axios的配置
  // baseUrl:基础路径，基于哪个路径
  //  如本项目中接口前缀为 /api，设置baseURL的作用就是后续见到访问地址时，会自动加上 /api ,避免每次都去书写
  baseURL: '/api',
  // 请求超时的时间，在5秒内无响应则请求失效
  timeout: 5000
})

/**
 * TODO-2：请求拦截器
 * 在发请求之前，请求拦截器可以进行监测，以便在请求发出前进行一些处理
 */
instance.interceptors.request.use(config => {
  // config：配置对象，其中含请求头header属性
  // 进度条开始
  nprogress.start()
  return config
})

/**
 * TODO-3：响应拦截器
 */
instance.interceptors.response.use(response => {
  // 响应成功的回调
  // 进度条结束
  nprogress.done()
  // 请求成功返回data，后续可直接使用data
  return response.data
}, err => {
  // 响应失败的回调
  console.log(err)
  // 终止Promise
  return Promise.reject(new Error('请求超时！'))
})

// 对外暴露,外部才可以使用
export default instance
